#include <termios.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/select.h>

int kbhit()
{
	struct timeval tv;
	struct termios old_termios, new_termios;
	int error;
	int count = 0;

	tcgetattr(0, &old_termios);
	new_termios = old_termios;
	
	// raw mode
	new_termios.c_lflag &= ~ICANON;
	
	// disable echoing the char as it is typed
	new_termios.c_lflag &= ~ECHO;
	
	// minimum chars to wait for
	new_termios.c_cc[VMIN] = 1;
	
	// minimum wait time, 1 * 0.10s
	new_termios.c_cc[VTIME]  = 1;
	error = tcsetattr(0, TCSANOW, &new_termios);

	// insert a minimal delay
	tv.tv_sec = 0;
	tv.tv_usec = 100;
	select(1, NULL, NULL, NULL, &tv);
	
	error += ioctl(0, FIONREAD, &count);
	error += tcsetattr(0, TCSANOW, &old_termios);
	
	return (error == 0 ? count : -1);
}

int main()
{
	while (!kbhit());
}

